import re
import json

#大模型的json转为前端展示格式
def sql2vue(bid_parse_res):
    # 标的清单及分包情况/项目概况和招标范围，转为列表
    if '标的清单及分包情况/招标范围' in bid_parse_res.keys():
        data = bid_parse_res.pop('标的清单及分包情况/招标范围')
        data_dict = {}
        for value in data:
            ls = []
            for sub_value in value['包括的标包为']:
                if not ls:
                    ls.append(list(sub_value.keys()))
                ls.append(list(sub_value.values()))
            data_dict[value['标的名称']] = ls
        bid_parse_res['基础信息'].update({"标的清单及分包情况/招标范围":data_dict})

    # 合并通用资格要求和专用资格要求
    if '通用资格要求' in bid_parse_res.keys():
        data1 = bid_parse_res.pop('通用资格要求')
        bid_parse_res['资格要求'] = {"通用资格要求": data1}

    # 专用资格要求处理
    if '专用资格要求' in bid_parse_res.keys():
        data2 = bid_parse_res.pop('专用资格要求')
        res = {}
        for value in data2:
            sub_value = value.pop('关联标的/标包/标段')
            res[sub_value] = list(value.values())[0]

        bid_parse_res['资格要求']["专用资格要求"] = res

    # 只需要表格展示的详细评审标准
    # if '详细评审标准' in bid_parse_res.keys() and '详细评审标准-表格展示' in bid_parse_res.keys():
    #     data = bid_parse_res.pop('详细评审标准-表格展示')
    #     bid_parse_res.pop('详细评审标准')
    #     #分为商务、技术和价格
    #
    #     #获取所有的评审
    #     modify_map = {}
    #     for key, value in data.items():
    #         for sub_key, sub_value in value.items():
    #             if sub_key not in modify_map.values():
    #                 # print(sub_key)
    #
    #                 # 将评审标题修改为常规，例：'（一）、商务评审（100）分'->商务评审
    #                 pattern = r'、(.*?)（'
    #                 matches = re.findall(pattern, sub_key, re.DOTALL)  # 抽取出内容并判断长度
    #                 if matches:
    #                     c_statement = matches[-1]
    #                     # print("\n-------step2查到的对应的内容为：\n", c_statement)
    #                 else:
    #                     c_statement = sub_key
    #                 modify_map[c_statement] = sub_key
    #
    #     #添加键
    #     # print(modify_map)
    #     for key in modify_map.keys():
    #         bid_parse_res[key] = {}
    #         for sub_key, sub_value in data.items():
    #             if modify_map[key] in sub_value.keys():
    #                 bid_parse_res[key][sub_key[5:]] = sub_value[modify_map[key]]

    # with open('详细评审标准1.json', 'w') as f:
    #     json.dump(bid_parse_res,f, ensure_ascii=False)
    #要大模型生成的详细评审标准
    if '详细评审标准' in bid_parse_res.keys() and '详细评审标准-表格展示' in bid_parse_res.keys():
        data = bid_parse_res.pop('详细评审标准')
        bid_parse_res.pop('详细评审标准-表格展示')
        #分为商务、技术和价格

        #获取所有的评审
        for item in data:
            #先获取标的标包
            bid_package = item.pop('适用标包')
            for key, values in item.items():

                # 将评审标题修改为常规，例：'（一）、商务评审（100）分'->商务评审
                pattern = r'、(.*?)（'
                matches = re.findall(pattern, key.replace('(','（'), re.DOTALL)  # 抽取出内容并判断长度
                if matches:
                    c_statement = matches[-1]
                    # print("\n-------step2查到的对应的内容为：\n", c_statement)
                else:
                    c_statement = key

                #添加商务、技术、价格评审
                if c_statement not in bid_parse_res.keys():
                    bid_parse_res[c_statement] = {}

                #添加标的标包
                if bid_package not in bid_parse_res[c_statement].keys():
                    bid_parse_res[c_statement][bid_package] = []

                #如果有值的画，先提取一下标题
                if values:
                    bid_parse_res[c_statement][bid_package].append(list(values[0].keys()))

                #添加值
                for value in values:
                    bid_parse_res[c_statement][bid_package].append(list(value.values()))


    # 其他额外信息转为三层结构
    if '其他额外信息' in bid_parse_res.keys():
        data = bid_parse_res.pop('其他额外信息')
        # 更新
        bid_parse_res.update(data)

    # 无效标与废标项
    if '无效标与废标项' in bid_parse_res.keys():
        data = bid_parse_res.pop('无效标与废标项')
        res = {}
        for i, value in enumerate(data, start=1):
            res[f"情况{i}"] = value
        bid_parse_res['无效标与废标项'] = {'无效标与废标项': res}

    # 投标文件要求
    if '投标文件要求' in bid_parse_res.keys():
        bid_parse_res['投标文件要求'] = bid_parse_res.pop('投标文件要求')

    # 投标文件要求
    if '开评定标流程' in bid_parse_res.keys():
        bid_parse_res['开评定标流程'] = bid_parse_res.pop('开评定标流程')

    # 应标需提交文件
    if '应标需提交文件' in bid_parse_res.keys():
        bid_parse_res['应标需提交文件'] = {"应标需提交文件":""}
    else:
        bid_parse_res['应标需提交文件'] = {"应标需提交文件": ""}

    # 初步评审标准，转为列表
    if '初步评审标准' in bid_parse_res.keys():
        data = bid_parse_res.pop('初步评审标准')
        ls = []
        for value in data:
            if not ls:
                ls.append(list(value.keys()))
            ls.append(list(value.values()))
        bid_parse_res['初步评审标准'] = {'初步评审标准': ls}

    # 将分值构成和中标推荐原则转为三层结构
    if '分值构成' in bid_parse_res.keys():
        data = bid_parse_res.pop('分值构成')
        ls = []
        for value in data:
            if not ls:
                ls.append(list(value.keys()))
            ls.append(list(value.values()))
        bid_parse_res['分值构成'] = {'分值构成': ls}

    #中标推荐原则
    if '中标推荐原则' in bid_parse_res.keys():
        data = bid_parse_res.pop('中标推荐原则')
        ls = []
        for value in data:
            if not ls:
                ls.append(list(value.keys()))
            ls.append(list(value.values()))
        bid_parse_res['中标推荐原则'] = {'中标推荐原则': ls}

    # 投标人须知前附表转为三层结构
    if '投标人须知前附表' in bid_parse_res.keys():
        data = bid_parse_res.pop('投标人须知前附表')
        ls = []
        for value in data:
            if not ls:
                ls.append(list(value.keys()))
            ls.append(list(value.values()))
        bid_parse_res['投标人须知前附表'] = {'投标人须知前附表': ls}

    # 将json格式化为3层结构
    # 第一层（横标题）改为列表结构
    first_ls = []

    for key, value in bid_parse_res.items():

        # 第二层（竖标题）改为列表
        second_ls = []
        try:
            value.items()
        except:
            print(key, value)
        for sub_key, sub_value in value.items():

            # 第三层（内容）改为列表
            third_ls = []
            if isinstance(sub_value, dict):
                for title, content in sub_value.items():
                    content_type = 'table' if isinstance(content, list) else 'string'
                    third_ls.append({"title": title, "content": content, "content_type": content_type})
            else:
                content_type = 'table' if isinstance(sub_value, list) else 'string'
                third_ls.append({"content": sub_value, "content_type": content_type})

            # bid_parse_res[key][sub_key] = res
            second_ls.append({"title": sub_key, "content": third_ls})

        first_ls.append({"title": key, "content": second_ls})

    return first_ls

if __name__ == '__main__':
    import json

    with open('/media/977GB/wcj_work/禅道/新视图开发/zentao/解析结果.json', 'r') as f:
        bid_parse_res = json.load(f)

    bid_parse_res = sql2vue(bid_parse_res)

    # with open('/media/977GB/wcj_work/禅道/新视图开发/zentao/bid/generate/前端返回结果2.json', 'w') as f:
    #     json.dump(bid_parse_res, f, ensure_ascii=False)

